import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.time.Period;


public class PeriodDemo {

    /**
     * ZERO：时间长度为零的常数。
     */
    @Test
    public void test01() {
        System.out.println(Period.ZERO); // 输出 P0D
    }
}


class PeriodDemo01 {

    /**
     * parse(CharSequence text)
     * 作用：将字符串解析成Period对象，字符串格式如下：
     *      "P2Y"        解析成  2年
     *      "P3M"        解析成  3个月
     *      "P4W"        解析成  4个星期
     *      "P5D"        解析成  5天
     *      "P1Y2M3D"    解析成  1年2月3天
     *      "P1Y2M3W4D"  解析成  1年2月3星期4天
     *      "P-1Y2M"     解析成  负1年正2月
     *      "-P1Y2M"     解析成  负1年负2月
     */
    @Test
    public void test01(){
        Period period01 = Period.parse("P1Y2M3D");
        System.out.println(period01.getYears()); // 输出 1
        System.out.println(period01.getMonths()); // 输出 2
        System.out.println(period01.getDays()); // 输出 3

        Period period02 = Period.parse("P1Y");
        System.out.println(period02.getYears()); // 输出 1
    }

    /**
     * between(LocalDate startDateInclusive, LocalDate endDateExclusive)
     * 作用：计算两个日期之间相差的年数、月数、天数。
     */
    @Test
    public void test02() {
        LocalDate startDate = LocalDate.parse("2021-01-01");
        LocalDate endDate = LocalDate.parse("2022-03-04");
        Period period01 = Period.between(startDate, endDate);
        System.out.println(period01.getYears()); // 输出 1
        System.out.println(period01.getMonths()); // 输出 2
        System.out.println(period01.getDays()); // 输出 3
    }

    /**
     * of(int years, int months, int days)
     * ofDays(int days)
     * ofMonths(int months)
     * ofWeeks(int weeks)
     * ofYears(int years)
     * 作用：指定时间长度创建period对象。
     */
    @Test
    public void test03(){
        System.out.println(Period.of(1, 2, 3)); // 输出 P1Y2M3D
        System.out.println(Period.ofYears(1)); // 输出 P1Y
        System.out.println(Period.ofMonths(2)); // 输出 P2M
        System.out.println(Period.ofDays(3)); // 输出 P3D
        System.out.println(Period.ofWeeks(4)); // 输出 P28D
    }
}

class PeriodDemo02{
    /**
     * addTo(Temporal temporal)
     * subtractFrom(Temporal temporal)
     * 作用：在其它时间对象上 加上/减去 period对象的时间长度。
     */
    @Test
    public void test01(){
        Period period01 = Period.parse("P1Y2M3D");
        LocalDate date01 = LocalDate.parse("2023-10-10");
        LocalDate date02 = (LocalDate) period01.addTo(date01);
        LocalDate date03 = (LocalDate) period01.subtractFrom(date01);
        System.out.println(date02); // 输出 2024-12-13
        System.out.println(date03); // 输出 2022-08-07
    }

    /**
     * getUnits()
     * 作用：获取period对象支持的时间单位。
     */
    @Test
    public void test02(){
        Period period01 = Period.parse("P1Y2M3D");
        System.out.println(period01.getUnits()); // 输出 [Years, Months, Days]
    }

    /**
     * isNegative()
     * 作用：只要有年月日中有一个值为负则为true。
     *
     * isZero()
     * 作用：只有年月日都为0时才为true。
     */
    @Test
    public void test03(){
        Period period01 = Period.parse("P1Y");
        Period period02 = Period.parse("P-1Y");
        Period period03 = Period.of(0, 0, 0);
        System.out.println(period01.isNegative()); // 输出 false
        System.out.println(period02.isNegative()); // 输出 true
        System.out.println(period01.isZero()); // 输出 false
        System.out.println(period03.isZero()); // 输出 true
    }

    /**
     * multipliedBy(int scalar)
     * 作用：对years，months，days三个属性值都乘以给定值。
     *
     * negated()
     * 作用：返回period对象的相反数。
     */
    @Test
    public void test04(){
        Period period01 = Period.parse("P1Y2M3D");
        System.out.println(period01.multipliedBy(2)); // 输出 P2Y4M6D
        System.out.println(period01.negated()); // 输出 P-1Y-2M-3D
    }

    /**
     * normalized()
     * 作用：标准化period对象。如：
     *      1年固定有12个月，对于P0Y13M1D的情况，调用normalized()可以标准化为P1Y1M1D。
     *      1个月的天数是不固定的，所以对于P365D无法标准化。
     *
     * toTotalMonths()
     * 作用：将period对象的时间长度以月份表示，返回值为 years * 12L + months。
     */
    @Test
    public void test05(){
        Period period01 = Period.parse("P0Y13M1D");
        Period period02 = Period.parse("P1Y1M1D");
        System.out.println(period01.normalized()); // 输出 P1Y1M1D
        System.out.println(period02.toTotalMonths()); // 输出 13
    }
}

